# 指定文件编码为UTF-8
# coding: utf-8

"""
train_deepnet.py 功能说明：
1. 训练一个深度卷积神经网络(DeepConvNet)用于MNIST手写数字识别
2. 使用Adam优化器进行训练，学习率0.001
3. 训练20个epoch，每个mini-batch包含100个样本
4. 每epoch评估1000个样本的准确率
5. 训练完成后保存网络参数到deep_convnet_params.pkl文件

网络结构特点：
- 包含6个卷积层和3个池化层
- 使用ReLU激活函数
- 包含Dropout层防止过拟合
- 最后一层为SoftmaxWithLoss

训练参数说明：
- epochs: 20
- mini_batch_size: 100
- optimizer: Adam
- learning_rate: 0.001
- evaluate_sample_num_per_epoch: 1000
"""

# 导入系统模块
import sys, os
# 添加父目录到系统路径
sys.path.append(os.pardir)
# 导入NumPy数值计算库
import numpy as np
# 导入matplotlib绘图库
import matplotlib.pyplot as plt
# 从dataset.mnist导入MNIST数据加载函数
from dataset.mnist import load_mnist
# 从deep_convnet导入深度卷积网络类
from deep_convnet import DeepConvNet
# 从common.trainer导入训练器类
from common.trainer import Trainer

# 加载MNIST数据集(不展平，保持图像结构)
(x_train, t_train), (x_test, t_test) = load_mnist(flatten=False)

# 初始化深度卷积网络
network = DeepConvNet()

# 创建训练器实例
trainer = Trainer(
    network,  # 网络实例
    x_train, t_train,  # 训练数据
    x_test, t_test,  # 测试数据
    epochs=20,  # 训练轮数
    mini_batch_size=100,  # 批量大小
    optimizer='Adam',  # 使用Adam优化器
    optimizer_param={'lr':0.001},  # 学习率0.001
    evaluate_sample_num_per_epoch=1000  # 每epoch评估1000个样本
)

# 开始训练
trainer.train()

# 保存训练好的参数到文件
network.save_params("deep_convnet_params.pkl")
print("Saved Network Parameters!")

"""
训练过程说明：
1. 每个epoch包含600次迭代(60000训练数据/100批量大小)
2. 每epoch结束时评估1000个训练样本和1000个测试样本的准确率
3. Adam优化器自动调整学习率，通常比SGD收敛更快
4. 训练完成后参数保存到deep_convnet_params.pkl文件

预期结果：
1. 训练准确率应随epoch增加而提高
2. 测试准确率应与训练准确率接近(避免过拟合)
3. 最终测试准确率应在99%以上

注意事项：
1. 完整训练可能需要较长时间(约10-20分钟)
2. 可调整学习率、批量大小等超参数观察效果
3. 如需快速测试，可减少epoch数
"""
